/**
 ******************************************************************************
 * @file           : bsp_iwdg.h
 * @brief          : IWDG Driver Header File (STM32H7xx)
 ******************************************************************************
 * @attention
 *
 * 独立看门狗（IWDG）驱动
 * 提供系统级故障保护，防止系统挂死
 * 
 * 特点：
 *   - 独立40kHz RC振荡器，不受系统时钟影响
 *   - 一旦启动无法关闭，只能复位
 *   - 超时时间可配置（0.1ms ~ 26214ms）
 *   - 适用于工业环境的高可靠性要求
 * 
 * 使用示例：
 *   iwdg_init(1000);              // 初始化，1秒超时
 *   while(1) {
 *       iwdg_feed();              // 定期喂狗
 *       // ... 业务逻辑
 *   }
 *
 ******************************************************************************
 */

#ifndef __BSP_IWDG_H
#define __BSP_IWDG_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>

/* Exported types ------------------------------------------------------------*/

/**
 * @brief 看门狗超时时间预设枚举
 */
typedef enum
{
    IWDG_TIMEOUT_500MS  = 500,      /* 500毫秒超时 */
    IWDG_TIMEOUT_1S     = 1000,     /* 1秒超时（推荐） */
    IWDG_TIMEOUT_2S     = 2000,     /* 2秒超时 */
    IWDG_TIMEOUT_5S     = 5000,     /* 5秒超时 */
    IWDG_TIMEOUT_10S    = 10000     /* 10秒超时 */
} iwdg_timeout_e;

/* Exported constants --------------------------------------------------------*/

/* 看门狗配置常量 */
#define IWDG_PRESCALER_MIN          IWDG_PRESCALER_4        /* 最小分频系数 */
#define IWDG_PRESCALER_MAX          IWDG_PRESCALER_256      /* 最大分频系数 */
#define IWDG_RELOAD_MIN             0                       /* 最小重载值 */
#define IWDG_RELOAD_MAX             4095                    /* 最大重载值 (12位) */

/* 看门狗时钟频率（Hz） */
#define IWDG_CLOCK_FREQ             40000                   /* 独立RC振荡器频率: 40kHz */

/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化函数 */
void iwdg_init(uint16_t timeout_ms);                        /* 初始化看门狗（指定超时时间ms） */
uint8_t iwdg_init_ex(uint32_t prescaler, uint16_t reload);  /* 初始化看门狗（自定义配置，成功返回1） */

/* 控制函数 */
void iwdg_feed(void);                                       /* 喂狗（重载计数器） */

/* 查询函数 */
uint8_t iwdg_is_enabled(void);                              /* 检查看门狗是否已启用（返回1=已启用） */
uint16_t iwdg_get_timeout(void);                            /* 获取当前超时时间（ms） */

/* 监控函数 */
uint32_t iwdg_get_last_feed_interval(void);                 /* 获取上次喂狗间隔时间（ms） */
void iwdg_check_feed_interval(void);                        /* 检查喂狗间隔（超过阈值打印警告） */

#ifdef __cplusplus
}
#endif

#endif /* __BSP_IWDG_H */
